package thread;

/**
 * 线程提供了一个方法:
 * void join()
 * 该方法可以允许一个线程在另一个线程上等待(阻塞),直到其执行完毕后才结束
 * 等待继续后续工作
 * 所以可以使用该方法协调线程的同步运行
 *
 * 线程的两种执行方式
 * 同步运行:线程执行时出现了先后顺序进行工作.
 * 异步运行:线程执行时各干各的,并发本身就是异步运行的.
 *
 */
public class JoinDemo {
    //标识图片是否下载完毕
    public static boolean isFinish = false;

    public static void main(String[] args) {
        /*
            isFinish不能作为局部变量的原因在于:
            java语法要求,当一个方法的局部内部类中若引用了该方法的某个
            局部变量时,该变量必须是final的.而final的变量又不可以在
            局部内部类中被二次赋值,因此不满足我们下面的使用需求.
         */
//        boolean isFinish = false;
        Thread download = new Thread(){
            public void run(){
                System.out.println("down:开始下载图片...");
                for(int i=1;i<=100;i++){
                    System.out.println("down:"+i+"%");
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException e) {
                    }
                }
                System.out.println("down:图片下载完毕!");
                isFinish = true;
            }
        };

        Thread show = new Thread(){
            public void run(){
                System.out.println("show:开始显示文字...");
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                }
                System.out.println("show:文字显示完毕!");

                System.out.println("show:开始显示图片...");
                System.out.println("show:开始等待download...");
                try {
                    download.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("show:等待download完毕!");
                if(!isFinish){
                    throw new RuntimeException("图片加载失败!");
                }
                System.out.println("show:显示图片完毕!");
            }
        };

        download.start();
        show.start();
    }
}














